import { LcDocument } from './editor.type';
import { ITypeEntity } from '../../../modules/superType/types';

/**
 * 文件变更类型
 */
export type ChangeAction = 'add' | 'modify' | 'delete';

/**
 * 文件变更差异
 */
export interface FileDiff<T> {
  before?: Partial<T>; // 变更前的状态
  after?: Partial<T>; // 变更后的状态
  patches?: string;
}

/**
 * 文件变更记录
 */
export interface FileChange<T> {
  id: string; // 变更ID
  action: ChangeAction; // 变更类型
  path: string; // 文件路径
  version: number; // 变更后的版本号
  timestamp: number; // 变更时间戳
  diff: FileDiff<T>; // 变更差异;
  author?: string; // 变更作者
  meta?: {
    tags?: string[]; // 标签列表
    type?: 'user' | 'ai' | 'system'; // 提交类型
    collaborationId?: string; // 协作会话ID
  };
  shadowSpace?: string;
  projectId?: string; // 项目ID
  isSync?: boolean; // 是否同步到云端
}

/**
 * 简化的文件快照信息
 * 用于快速比对场景，包含最核心的四个字段
 */
export interface FileSnapshot {
  /** 文件路径 */
  path: string;
  /** 最后修改时间戳 */
  modify: number;
  /** 文件内容哈希值 */
  hash: string;
  /** 最后修改者 */
  updateBy: string | number;
}

/**
 * 比对方标识
 * 用于标识变更来自哪一方
 */
export type CompareSide = 'source' | 'target' | 'both';

/**
 * 扩展的文件变更记录
 * 在标准 FileChange 基础上添加比对信息
 */
export interface FileChangeWithSide<T> extends FileChange<T> {
  /** 变更来源方 */
  side: CompareSide;
  /** 来源方标识（如 'editor', 'shadow-space', 'local', 'remote', 'user-A', 'user-B'） */
  sourceLabel?: string;
  /** 目标方标识 */
  targetLabel?: string;
  /** 源快照（用于显示变更前的状态） */
  source?: FileSnapshot;
  /** 目标快照（用于显示变更后的状态） */
  target?: FileSnapshot;
  /** 编辑器侧的文件哈希（用于变更检测） */
  editorHash?: string | null;
  /** 影子空间侧的文件哈希（用于变更检测） */
  spaceHash?: string | null;
  /** 是否为潜在冲突（时间戳相同但内容不同） */
  conflict?: boolean;
}

/**
 * 提交中的变更记录
 */
export interface CommitChanges {
  documents: Record<string, FileChange<LcDocument>>;
  types: Record<string, FileChange<ITypeEntity>>;
}

/**
 * 🆕 简化的提交记录 - 不再使用分支概念
 */
export interface LcCommit {
  _id: string; // 提交ID
  projectId: string; // 项目ID
  parentCommitId?: string; // 父提交ID（提交链）

  // 提交信息
  message: string; // 提交信息
  author: {
    userId: number;
    username: string;
  };
  timestamp: number; // 提交时间戳

  // 版本类型
  type: 'development' | 'release' | 'hotfix';

  // 快照和变更
  snapshot: FileSnapshot[]; // 完整文件快照
  changes: FileChangeWithSide<any>[]; // 变更记录
  snapshotIds: string[]; // 文件副本ID数组

  // 🆕 发布标签（仅release类型有）
  releaseTag?: {
    version: string; // v1.0.0
    description: string; // 发布说明
    isActive: boolean; // 是否为当前活跃发布版本
  };

  // 统计信息
  stats: {
    filesChanged: number;
    additions: number;
    modifications: number;
    deletions: number;
  };

  // 元数据
  meta?: {
    tags?: string[]; // 自定义标签
    aiAgent?: string; // AI代理ID
    collaborationId?: string; // 协作会话ID
  };
}

/**
 * 🆕 文件副本表 - 统一存储所有类型的文件副本
 */
export interface LcFileSnapshot {
  _id: string; // 副本ID
  hash: string; // 文件内容hash（用于去重）
  type: 'document' | 'type' | 'project'; // 文件类型
  data: any; // 完整文件内容（LcDocument | ITypeEntity | LcProject）

  // 元数据
  projectId: string; // 项目ID
  originalId: string; // 原始文件ID
  path: string; // 文件路径
  createTime: number; // 创建时间
  size: number; // 数据大小（字节）
}

/**
 * 🆕 项目版本状态 - 替代分支概念
 */
export interface ProjectVersionState {
  _id: string;
  projectId: string;

  // 当前开发版本（相当于HEAD指针）
  developmentCommitId?: string; // 最新的开发提交

  // 当前发布版本
  releaseCommitId?: string; // 当前发布版本的提交
  releaseVersion?: string; // 当前发布版本号

  // 时间信息
  createTime: number;
  updateTime: number;
}

/**
 * 提交查询选项
 */
export interface CommitQueryOptions {
  projectId: string;
  branch?: string;
  path?: string;
  startTime?: number;
  endTime?: number;
  type?: 'user' | 'ai' | 'system';
  limit?: number;
  skip?: number;
}

/**
 * 提交历史记录
 */
export interface CommitHistory {
  commits: LcCommit[];
  total: number;
  hasMore: boolean;
}

/**
 * 🆕 数据库中的文件变更记录
 * 与前端的 FileChange 不同，这是后端数据库存储的格式
 */
export interface LcFileChange {
  _id: string;
  projectId: string;
  path: string;
  action: 'add' | 'modify' | 'delete';
  version: number;
  timestamp: number;
  author?: string;
  userId: number;
  message?: string;
  // 🆕 变更类型
  changeType: 'snapshot' | 'patch';
  // 快照字段
  content?: string; // 仅快照有完整内容
  previousContent?: string;
  // 补丁字段
  patch?: string; // 仅补丁有差异数据（前端生成的 unified diff）
  baseVersion?: number; // 补丁指向的基础快照版本
  // 其他字段
  contentHash?: string;
  fileSize?: number;
  stats?: {
    linesAdded: number;
    linesDeleted: number;
    linesModified: number;
  };
  meta?: {
    type?: string;
    source?: string;
    clientInfo?: string;
  };
  create_time?: number;
  update_time?: number;
}
